勇哥的C#版继承Treeview的带按钮的树形控件(带源码)

您所在的位置:网站首页 vb 树形控件 勇哥的C#版继承Treeview的带按钮的树形控件(带源码)

勇哥的C#版继承Treeview的带按钮的树形控件(带源码)

#勇哥的C#版继承Treeview的带按钮的树形控件(带源码)| 来源: 网络整理| 查看: 265

勇哥注:

此控件是继承TreeView控件重写的用户组件,主要特点是可以在节点文本右边添加按钮。

按钮本身就是一个Button类,可以设置按钮的显示相关的属性,以及事件等。

此控件可以方便提供IO、气缸、轴的测试功能,不用双击弹出另一个窗口做这些事。有效的提升了用户体验。

image.png

使用方法说明:

(1)此控件带一个WpfTreeHelper类,以方便操作控件

(2)初始化树时,无论是根结点,还是子节点,都使用AddNode方法来完成。

            tree.ClearAllNode();             tree.AddNode(null, "根1", -1, null);             tree.AddNode("根1", "气缸,叶1", 0, createBtnByNodeType);             tree.AddNode("根1", "气缸,叶2", 0, createBtnByNodeType);             tree.AddNode("根1", "轴,叶3", 1, null);             tree.AddNode("根1", "叶4", -1, null);             tree.AddNode("叶4", "输入IO,叶41", 3, createBtnByNodeType);             tree.AddNode("叶4", "输入IO,叶42", 3, createBtnByNodeType);             tree.AddNode("叶4", "输出IO,叶43", 2, createBtnByNodeType);             tree.ExpandAllNode();

方法原型如下:

        ///          /// 如果parentNodeName为null或空串,则创建父节点,否则创建父节点的子节点; 异常:ArgumentException         ///          ///          ///          public void AddNode(string parentNodeName, string nodeName,int nodetype,              CreateButtonDelegate createBtnFunction)

nodeName这里约定型如:  节点类型,节点名字

例如: “气缸,叶1”

           ”输入IO,叶41“

image.png

控件内部会按“节点类型”字符串进行归类,给予索引。

比如上面的初始化代码,归类为4种节点类型,索引为0,1,2,3

在方法最后一个参数的委托方法中,使用这个索引来创建不同属性的按钮。

CreateButtonDelegate是一个委托方法,需要你自己来实现。

下面是调用者实现了此委托,它主要用于区分节点类型,以此来决定按钮应该有几个、显示什么内容。

        private ButtonMenu createBtnByNodeType(string nodeName,int nodetype)         {             ButtonMenu btnMenuObj = null;             Button btnObj1 = null;             Button btnObj2 = null;                        switch (nodetype)             {                 case 0: // "气缸":                     btnMenuObj = new ButtonMenu(this.wpfTreeView1);                     btnObj1 = new Button();                     btnObj1.Text = "升起";                     btnObj1.Width = 40;                     btnObj1.Tag = $"{nodeName}|升起";                     btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", new ButtonItemClickEventHandler(upClick)));                     btnObj2 = new Button();                     btnObj2.Text = "降下";                     btnObj2.Width = 40;                     btnObj2.Tag = $"{nodeName}|降下";                     btnMenuObj.AddButtonItems(new ButtonItem(btnObj2, "", new ButtonItemClickEventHandler(downClick)));                     break;                 case 1: // "轴":                     btnMenuObj = null;                     break;                 case 2: // "输出IO":                     btnMenuObj = new ButtonMenu(this.wpfTreeView1);                     btnObj1 = new Button();                     btnObj1.Text = "  ";                     btnObj1.Width = 40;                     btnObj1.Tag = $"{nodeName}|  ";                     btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", new ButtonItemClickEventHandler(outClick)));                     break;                 case 3: // "输入IO":                     btnMenuObj = new ButtonMenu(this.wpfTreeView1);                     btnObj1 = new Button();                     btnObj1.Text = "  ";                     btnObj1.Width = 40;                     btnObj1.Tag = $"{nodeName}|  ";                     btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", null));                     break;                             }             return btnMenuObj;         }

(3)WpfTreeHelper.GetNodeInfoList() 可以取全部节点的信息。

节点信息是NodeStruct结构体,它可以方便查阅节点的级别、类型、同级索引等信息。

   public struct NodeStruct: IComparable     {         ///          /// 节点名字         ///          public string NodeName;         ///          /// 节点级别,顶层节点为0         ///          public int NodeLevel;         ///          /// 父结点的名字         ///          public string ParentNodeName;         ///          /// 同父节点的子项目的索引号         ///          public int Index;         ///          /// 选择的状态,有三种: 0不勾选Unchecked, 1勾选Checked, 2不确定Indeterminate(暂时不支持此状态,为保留状态)         ///          public int CheckStatus;         ///          /// 结点类型,0调试结点,1调试IO结点, 2调试气缸结点         ///          public int NodeType;         ///          /// 创建按钮的委托         ///          ///          ///          public WpfTreeHelper.CreateButtonDelegate CreateNodeButton;         public int CompareTo(NodeStruct other)         {             if (Index > other.Index) return 1;             else if (other.Index 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3